Prólogo
Como sugiere la figura a continuación, la atención y los recursos globales se han enfocado en el desarrollo y la distribución de vacunas, dejando otras crisis humanitarias menos atendidas. A medida que transitamos hacia una etapa post-pandemia, esperamos que este informe logre captar tu atención para ayudar a combatir la trata de personas con tu experiencia en aprendizaje automático y análisis de datos. Cualquier tipo de aporte es bienvenido y te agradecemos sinceramente por dedicar tu tiempo e interés a revisar este informe.
Palabras clave: trata de niños, adultos, mujeres y personas; explotación sexual; trabajo forzado; esclavitud; soluciones con aprendizaje automático
import pandas as pd
from pycountry_convert import country_alpha2_to_country_name, country_name_to_country_alpha3
import os,sys
from glob import glob
import polars as pl
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
import warnings; warnings.filterwarnings("ignore")
# =========== load CSV files ===========
if ('d_dfs' in globals())==False:
d_dfs={}
files =[r"C:\Users\Gustavo\Desktop\Human T\DatasetVersions.csv",
r"C:\Users\Gustavo\Desktop\Human T\Datasets.csv"]
for i, f in enumerate(files):
f1 = os.path.splitext(os.path.basename(f))[0]
try:
k = 'CreationDate'
d_dfs[f1] = pd.read_csv(f,parse_dates= [k] )
d_dfs[f1]['creation_time_index'] = d_dfs[f1][k].dt.year*100 + d_dfs[f1][k].dt.month
except:
try:
k = 'VoteDate'
d_dfs[f1] = pd.read_csv(f,parse_dates = [k] )
d_dfs[f1]['vote_time_index'] = d_dfs[f1][k].dt.year*100 + d_dfs[f1][k].dt.month
except:
d_dfs[f1] = pd.read_csv(f)
print(d_dfs.keys())
dict_keys(['DatasetVersions', 'Datasets'])
#juntar dos datasets
all_on_ds_df=pl.DataFrame( d_dfs['Datasets'] ).join( pl.DataFrame( d_dfs['DatasetVersions'] ), left_on ='Id', right_on ='DatasetId' )
d_dfs['Datasets']=d_dfs['Datasets'].sort_values('Id')
try:
del Records
except:
pass
# =========== Search on relevant datasets and those on covid and fraud for comparison ===========
wordlist = [ 'COVID', 'Fraud', 'smuggle people', 'smuggling of people', 'kidnapping','missing migrant', 'missing people', 'abduction', 'human traffick', 'child traffick', 'drug traffick', 'adult traffick', 'sex traffick','women traffick', 'labour exploitation','labor exploitation', 'forced labour', 'forced labor', 'modern slave' ]
for i,word in enumerate(wordlist):
if i>1:
df1= all_on_ds_df.filter( pl.col('Title').str.contains(r'(?i)%s'%word) | pl.col('Subtitle').str.contains(r'(?i)%s'%word) | pl.col('Description').str.contains(r'(?i)%s'%word) )
else:
df1= all_on_ds_df.filter( pl.col('Title').str.contains(r'(?i)%s'%word) | pl.col('Subtitle').str.contains(r'(?i)%s'%word) )
if ('traffick' in word) | ('smuggl' in word):
w = 'human trafficking'
df = df1.with_columns( pl.lit(2).alias('marker'))
elif ('labour' in word) | ('labor' in word) | ('slave' in word):
w = 'forced labour'
df = df1.with_columns( pl.lit(2).alias('marker'))
elif ('missing' in word) | ('kidnapping' in word) | ('abduction' in word) :
w = 'Missing people'
df = df1.with_columns( pl.lit(2).alias('marker'))
else: # COVID, fraud
w = word
df = df1.with_columns( pl.lit(1).alias('marker'))
df = df.with_columns( pl.lit(w).alias('theme'))
df = df.with_columns( (pl.concat_str(pl.col('theme'), pl.col('Slug'), separator=" | ")).alias('theme_slug') )
try:
Records = pl.concat( [Records, df], )
except:
Records = df.clone()
# =========== Preprocess ===========
df = Records.to_pandas()
from datetime import datetime
day=datetime.today().day
mon=datetime.today().month
yr=datetime.today().year
today = pd.to_datetime(datetime.today().strftime('%Y-%m-%d 00:00:00'))
df['age'] = np.log1p((today - df['CreationDate']).dt.days / 30)
df['time_index'] = df['creation_time_index'] - 200000
df['nViews'] = df['TotalViews'] / (df['age'] + 1e-10) * 100
df['nvotes'] = df['TotalVotes'] / (df['age'] + 1e-10) * 100
df['ndownloads'] = df['TotalDownloads'] / (df['age'] + 1e-10) * 100
df['nkernels'] = df['TotalKernels'] / (df['age'] + 1e-10) * 100
df['popularity'] = (
df['nViews'] + 2 * df['nvotes'] + df['ndownloads'] + df['nkernels']
) + 10
df['theme'] = df['theme'].replace({
'COVID': 'COVID',
'Fraud': 'Fraude',
'Missing people': 'Personas desaparecidas',
'forced labour': 'Trabajo forzado',
'human trafficking': 'Trata de personas'
})
import plotly.express as px
import plotly.graph_objects as go
# Ordenar por tiempo
d1 = df.sort_values('time_index')
# Crear gráfico de dispersión
fig = px.scatter(
d1,
y='theme_slug',
x='time_index',
color='theme',
symbol='theme',
hover_name='Slug',
size_max=8,
height=800,
width=1200
)
# Ajustar ticks del eje X
fig.update_xaxes(
tickangle=40,
tickvals=[1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300],
ticktext=['2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023'],
title_text='Fecha'
)
# Ajustar eje Y
fig.update_yaxes(title_text='Tema')
# Título y estilo en español
fig.update_layout(
title=dict(
font=dict(color='darkred', size=16),
text='<b>- Usa el zoom para ver por mes<br>'
'- Desactiva temas para enfocarte en "trabajo forzado" o "trata de personas"<br>'
'- Haz clic en AutoScale para reiniciar la vista</b>'
),
margin=dict(t=100, l=200),
font=dict(family="Arial", size=12),
)
# Mostrar el gráfico dentro de VS Code (si estás en Jupyter)
fig.show(renderer="notebook")
Ilustración del autor sobre algunos de los problemas de trata de personas que enfrenta el mundo.
La trata de personas es una grave violación de nuestros derechos humanos fundamentales. Estimaciones de la Organización Internacional del Trabajo en 2016 indican que más de cinco personas en el mundo caen víctimas de la trata cada día (Toney-Butler et al., 2023), afectando a más de cuarenta y tres millones de familias a nivel global, con un 72% de las víctimas siendo mujeres y niñas.
Desafortunadamente, la mayoría de las estadísticas publicadas están subestimadas (TIP 2023; Chaney et al., 2023; IOM 2023), ya que los delitos de trata suelen no denunciarse, y las tasas de supervivencia de las víctimas son bajas, especialmente en casos que involucran mendicidad forzada (Borgen Project, 2023), niños soldados (Cockbain et al., 2021), extracción de órganos (Li et al., 2022), entre otros.
El daño físico y psicológico causado a las víctimas es permanente, si no fatal (Bekogianni et al. 2019; TIP 2021). Por ejemplo, el estudio de Gezie et al. (2021) analizó a sobrevivientes de trabajo forzado para evaluar el impacto en su salud física tras ser rescatados. De los 1.387 participantes que transitaron por los corredores de Etiopía para trabajo forzado:
- El 37% fue explotado en labores domésticas.
- El 27% en ganadería o agricultura.
- El 18% en industrias de servicios o manufactura.
Luego de ser rescatados, muchos reportaron problemas de salud como infecciones urinarias, problemas ginecológicos, fracturas óseas, dolores de espalda, dolores estomacales, pérdida de memoria, entre otros.
Desde un punto de vista económico, la trata de personas representa un negocio ilegal de $150.000 millones de dólares que afecta a todos los sectores: industrias de belleza, entretenimiento, hospitalidad, construcción, agricultura, pesca comercial. Las redes criminales suelen operar bajo el modelo A-M-P (Dimas et al., 2022):
- Acciones que los perpetradores toman (reclutar, albergar, transportar, proveer, etc.) mediante...
- Medios de "fuerza, fraude o coerción" (Toney-Butler et al., 2023); con fines de...
- Propósitos como explotación sexual o laboral.
Desglosando el modelo A-M-P en términos más accesibles, los pasos de los tratantes incluyen: seducción, manipulación emocional, coerción, explotación y reclutamiento hacia sitios de esclavitud.
Se disfrazan como vecinos amables, parejas sentimentales o incluso familiares amorosos (Shen, 2016). Cualquier persona vulnerable puede convertirse en su próximo objetivo. Factores de riesgo incluyen experiencias adversas en la infancia, abuso sexual previo, violencia doméstica, violencia de pandillas, violencia comunitaria, falta de educación, desconocimiento y explotación cultural.
Los tratantes reclutan en cualquier parte del mundo, con mayor éxito en países en desarrollo o en guerra. Según Mileski et al. (2020), el trabajo forzado en la pesca comercial ocurre en países como Estados Unidos, Emiratos Árabes Unidos, Tailandia, Taiwán, Sudán, Filipinas, Irlanda, etc.
Los registros del Global Human Trafficking dataset publicados por el Counter-Trafficking Data Collaborative (ver sección posterior) muestran en el mapa a continuación la magnitud del problema. Pero dicho mapa solo refleja estadísticas parciales; muchos otros casos no se reportan. Incluso en países desarrollados, los testimonios de víctimas son numerosos. Por ejemplo, el Consejo Europeo (2023) expone casos de adolescentes en Países Bajos que fueron seducidos por sus parejas para prostituirse en su propio país, y relatos de personas extranjeras en tránsito que fueron detenidas ilegalmente y forzadas a realizar labores domésticas tras confiscarles el pasaporte en países como Francia o Siria.
import os, sys
import IPython
from IPython.display import display, HTML
from pathlib import Path
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
import plotly
import plotly.express as px
import warnings; warnings.filterwarnings('ignore')
import umap
from plotly.offline import init_notebook_mode; init_notebook_mode(connected=True);
ght_df = pd.read_csv(r"C:\Users\Gustavo\Desktop\Human T\human_trafficking.csv")
ght_df.replace('-99', np.nan, inplace=True)
ght_df.replace(-99, np.nan, inplace=True)
from pycountry_convert import country_alpha2_to_country_name, country_name_to_country_alpha3
def get_alpha3(col):
try:
iso_3 = country_name_to_country_alpha3(col)
except:
iso_3 = 'Unknown'
return iso_3
def get_name(col):
try:
name = country_alpha2_to_country_name(col)
except:
name = 'Unknown'
return name
ght_df['country'] = ght_df['citizenship'].apply(lambda x: get_name(x))
ght_df['alpha_3'] = ght_df['country'].apply(lambda x: get_alpha3(x))
ght_map = pd.DataFrame(ght_df.groupby(['country', 'alpha_3'])['alpha_3'].agg(Victims='count')).reset_index()
fig = px.choropleth(ght_map, locations="alpha_3", color="Victims", hover_name="country")
fig.update_layout(
autosize=False,
width=800,
title_text="Prevalencia mundial de la trata de personas según estadísticas de 2002 a 2019 recopiladas por el centro global de datos Counter-Trafficking Data Collaborative",
title_x=0.5,
title_y=0.95,
title_font=dict(size=8, color='black'),
)
fig.show()
S3b. Difusión de datasets sobre trata de personas y análisis exploratorios publicados en los cuadernos de usuarios
Por brevedad, llamamos a la figura anterior "gráfico de crecimiento", el cual enumera los datasets relevantes sobre trata de personas publicados en Kaggle durante la última década. Los lectores pueden interactuar con él para consultar títulos de los datasets y otras estadísticas llamativas (por ejemplo, número de vistas, votos positivos, etc.).
Como se mencionó antes, en la figura de portada puede observarse que la cantidad de datasets publicados fue impulsada más por objetivos y avances relacionados con la salud (por ejemplo, COVID-19) y las finanzas (por ejemplo, fraudes) que por esfuerzos enfocados directamente en la lucha contra la trata de personas. El tamaño del marcador indica el promedio mensual de descargas del dataset, que sirve como medida aproximada de su "popularidad" dentro de la comunidad de Kaggle.
En las tablas siguientes resumimos los datasets relevantes alojados en Kaggle y luego detallamos aquellos que son altamente relevantes y/o poco explorados. Observa que todos, excepto las dos primeras filas, involucran datos estrictamente tabulares o series temporales, y al menos seis datasets listados contienen datos recopilados a partir de 2021 en adelante.
| Región | Año | Nombre | Fuente | Información general | Discusión dentro/fuera de Kaggle | Notas de uso |
|---|---|---|---|---|---|---|
| Global | 2019 | Dataset Hotel-ID-50k 2019 | Artículo de Stylianou et al, (2019) | Ver Sección III-1a | ||
| Global | 2021 | Dataset Hotel-ID 2021 | Imágenes de habitaciones de hotel subidas mediante la aplicación móvil TraffickCam (Kamath et al. 2021) | Ver Sección III-1a | ||
| Global | Actualizado anualmente | World Factbook de la CIA | CIA World Factbook | Datos web extraídos del almanaque de la CIA | 1 notebook | |
| Global | 2020 | Global Human Trafficking (GHT) | Counter-Trafficking Data Collaborative | Datos sobre 50,000 casos | 3 notebooks EDA en Kaggle | Valores faltantes indicados con -99. Blog en Medium analiza flujos de trata |
| Global | 2018 | Esclavitud Moderna | Reporte del General Intelligence Service (GIS) | Resumen CSV compilado | Aplicación GIS de visualización geoespacial | |
| Europa | 2018 | Detección de personas en riesgo mediante aprendizaje semi-supervisado | Conferencia IEEE/ACM 2018 sobre Análisis de Redes Sociales y Minería | Datos etnográficos online con 18 atributos y 1,048,575 muestras extraídas de foros adultos europeos | Notebook EDA tras limpieza | Código inicial en suplementario |
| Reino Unido | 2013-2016 | Trata de Personas en Reino Unido (UKHT) | Agencia Nacional contra el Crimen del Reino Unido (NCA) | Reportes del sitio web NCA | Notebook visualizando incidentes reportados en el tiempo | |
| India | 2018-2020 | Trata de Personas en India (HTI) | Oficina Nacional de Registros Criminales de India | Datos agregados como casos reportados anuales por estado/territorio y etnicidades de víctimas | Análisis en R por usuario de Kaggle | |
| Nepal | 2018-2019 | CID NEPAL 2076 y Esclavitud Mundial | Revista CID 2076 | Año fiscal 2018-2019 | Análisis preliminar mensual de incidentes en Nepal por usuario de Kaggle |
Datasets generales sobre crimen¶
| País de origen | Año | Nombre | Fuente | Información general | Publicaciones y discusiones dentro/fuera de Kaggle | Notas de uso |
| :-- | :-- | :-- | :-- | :-- | :-- | :-- |
| Canadá | 1994-1996 | Red criminal variable en el tiempo | Investigaciones CAVIAR (1994-1996) | Matrices que describen conexiones en redes en distintos períodos de tiempo recopiladas durante la investigación | Análisis exploratorio por usuario de Kaggle | |
| EE.UU. | 2014-2017 | Base de datos del FBI sobre trata de personas | Oficina Federal de Investigación (FBI) | Datos obtenidos de reportes criminales | Notebook de análisis exploratorio | Registros incluyen delitos y arrestos que podrían no "interpretarse como declaraciones definitivas de trata de personas" |
| EE.UU. | N/A | Dataset T-Visa | Ciudadanía e Inmigración de EE.UU. | $n=188$ | - Según el código Suplementario, una revisión rápida del dataset revela que el 93.6% de solicitudes fueron hechas por víctimas de trata de personas.
- No ha sido explorado por otros usuarios de Kaggle.
- Enlazado en el Suplementario |
| EE.UU. | 2017 | Datos de crimen en Denver | Sistema Nacional de Reporte Basado en Incidentes (NIBRS) | Datos provenientes de reportes criminales | - Actualización dinámica anual mensual; correcciones posibles en versiones posteriores.
- Aplicación Shiny promovida por usuario de Kaggle |
| EE.UU. | 2019-2021 | Crimen en Georgia | Programa uniforme de reporte de crímenes en Georgia | "Datos penales, procesales, arrestos, delitos y condenas" [ibíd.] | | |
| EE.UU. | 2003-2015 | Clasificación del crimen en San Francisco | San Francisco OpenData | Datos provenientes de reportes criminales | - Clasificación de actividades criminales como prostitución, delitos sexuales, pornografía, secuestro, personas desaparecidas, etc.
- Dashboard en Tableau promovido por usuario de Kaggle |
| India | 2021 | Crimen en India | Actualizado por usuario comunitario en 2017 | "Datos por estado" [ibíd.] | Notebook de ejemplo | La autenticidad del dataset ha sido cuestionada por un usuario de Kaggle |
Otros datasets¶
| Naturaleza | Año | Nombre | Fuente | Publicaciones y discusiones dentro/fuera de Kaggle | Notas de uso |
| :-- | :-- | :-- | :-- | :-- | :-- |
| Global | 2018-2022 | Índice de Libertad Humana | Vasquez et al. 2022 | Informes anuales | No explorado aún por usuarios de Kaggle | Incluye atributos específicos sobre mujeres |
| Global | 2019 | Dataset Elliptic | Gráfico de transacciones Bitcoin | Weber et al. | "El gráfico contiene 203,769 nodos y 234,355 aristas. El 2% (4,545) están etiquetados como class1 ilícitos; el 21% (42,019) como class2 lícitos." |
| Global | 2020 | Violencia contra mujeres y niñas | Encuestas Demográficas y de Salud en hogares representativos a nivel nacional | Encuestas de hogares | Dashboard Dash web por usuario de Kaggle |
| Global | 2014-2021 | Proyecto Missing Migrants OIM | Organización Internacional para las Migraciones | Ver código inicial en Suplementario | - 7 notebooks desde su primera publicación
Basado en EDA, un notebook de Kaggle concluye: "La frontera EE.UU.-México es el lugar más mortal para refugiados; Norte de África ocupa segundo lugar. Mayor pérdida de vidas fue en 2015, la mayoría por ahogamiento." | Dataset discutido por Pham y Komiyama (2022) |
| Canadá | 2019 | Anuncios sexuales en Canadá | Chain Breaker, herramienta en la nube para extraer, almacenar y analizar datos web sobre anuncios de servicios sexuales | 3,463 anuncios | Blogger en Kaggle explica cómo utiliza scraping y aprendizaje automático en la nube para combatir la trata de personas |
| Pakistán | N/A | Dataset sobre secuestros | Profesor Asociado de la Universidad de Karachi, Pakistán | Artículo relacionado por Lolayekar et al. (2022) | Se podría requerir indagación para obtener metainformación |
| Rusia | 1980-1996 | Primeras noticias rusas sobre adicción a las drogas | Usuario de Kaggle | Noticias y otras publicaciones sobre drogas ilegales y consumidores de drogas, publicadas en marzo 2023 | No explorado aún por usuarios de Kaggle |
| Rusia | 2014-2021 | Personas desaparecidas en Rusia (MPR) | Ministerio del Interior de la Federación Rusa (enlace inaccesible desde América del Norte) | Datos oficiales sobre "personas desaparecidas y buscadas, cadáveres identificados y no identificados" | Notebook Kaggle traduce algunas columnas del ruso al inglés | Como se muestra en Suplementario, refleja cantidad de cadáveres no identificados y personas desaparecidas en Rusia |
| Sintético | | Transacciones IBM para Anti-Lavado de Dinero (AML) | Datos sintéticos que imitan transacciones financieras criminales | | |
Observaciones del dataset Global Human Trafficking (GHT) ¶
El dataset GHT, depositado por el Counter-Trafficking Data Collaborative (CTDC), es el primer portal de datos en el mundo sobre la trata de personas. CTDC sugiere que el dataset puede ser utilizado para análisis exploratorios que ayuden a entender la demografía de las víctimas. Los datos de series temporales incluidos también pueden usarse para construir modelos predictivos y de identificación de actividades relacionadas con la trata.
Análisis exploratorios preliminares realizados por Ms. Satvik (2023), una estudiante de India, revelan que la mayoría de víctimas registradas en esta base de datos provienen de Filipinas, Ucrania y la República de Moldavia.
Otro usuario, Mr. Polevoi, utilizó gráficos interactivos para examinar la edad y el género de las víctimas. Los medios de control más reportados por las mujeres fueron abuso psicológico, abuso físico, amenazas, uso de sustancias psicoactivas y restricción de movimiento. Al extender su código, se genera una figura que muestra que los hombres también reportaron estos medios de control, aunque con menor frecuencia que las mujeres.
Nuestras interpretaciones basadas en su análisis exploratorio incluyen:¶
- No se encontraron diferencias de género en otros tipos de abuso como la retención de documentos importantes o falsas promesas.
- La mayoría de las víctimas (>15.3k) eran mujeres que reportaron explotación sexual.
- Estas explotaciones sexuales se distribuyeron principalmente en: prostitución (95.6%), pornografía (3.4%) y servicios sexuales privados (1%).
- No se observaron diferencias significativas entre géneros en los casos de trabajo forzado.
- Los depredadores de las víctimas femeninas eran, principalmente, parejas íntimas, familiares y amigos, como se muestra en la figura titulada Relación Víctima-Depredador.
# Normalizar la columna para que 'Abuse' esté en minúsculas
ght_df['meansOfControlConcatenated'] = ght_df['meansOfControlConcatenated'].str.replace('Abuse', 'abuse', regex=True)
# Contar los medios de control por género
data_bar_f = ght_df[(ght_df.meansOfControlConcatenated.notna()) & (ght_df.gender == 'Female')].meansOfControlConcatenated.apply(lambda x: pd.value_counts(str(x).split(";"))).sum(axis=0)
data_bar_m = ght_df[(ght_df.meansOfControlConcatenated.notna()) & (ght_df.gender == 'Male')].meansOfControlConcatenated.apply(lambda x: pd.value_counts(str(x).split(";"))).sum(axis=0)
from plotly.subplots import make_subplots
traducciones = {
"Debt bondage": "Esclavitud por deudas",
"Physical abuse": "Abuso físico",
"Psychological abuse": "Abuso psicológico",
"Sexual abuse": "Abuso sexual",
"Threats": "Amenazas",
"Withholds documents": "Retención de documentos",
"Excessive working hours": "Exceso de horas laborales",
"False promises": "Falsas promesas",
"Restricts movement": "Restricción de movimiento",
"Takes earnings": "Confiscación de ingresos",
"Withholds necessities": "Retención de necesidades",
"Restricts medical care": "Restricción médica",
"Psychoactive substances": "Sustancias psicoactivas",
"Threat of law enforcement": "Amenaza policial",
"Other": "Otro",
"Not specified": "No especificado",
"Uses children": "Uso de menores",
"Restricts financial access": "Restricción financiera",
"Friend/Acquaintance": "Amigo/Conocido",
"Family/Relative": "Familiar/Pariente",
"Intimate Partner": "Pareja íntima"
}
# Aplicar traducciones a los índices
data_bar_f.rename(index=traducciones, inplace=True)
data_bar_m.rename(index=traducciones, inplace=True)
# Crear figura con dos columnas
fig = make_subplots(rows=1, cols=2)
# Agregar barras de medios de control (izquierda)
fig.add_trace(go.Bar(name='Mujer', x=data_bar_f.index, y=data_bar_f), row=1, col=1)
fig.add_trace(go.Bar(name='Hombre', x=data_bar_m.index, y=data_bar_m), row=1, col=1)
# Contar relaciones con reclutadores por género
data_bar_f_rel = ght_df[(ght_df.RecruiterRelationship.notna()) & (ght_df.gender == 'Female')].RecruiterRelationship.apply(lambda x: pd.value_counts(str(x).split("; "))).sum(axis=0)
data_bar_m_rel = ght_df[(ght_df.RecruiterRelationship.notna()) & (ght_df.gender == 'Male')].RecruiterRelationship.apply(lambda x: pd.value_counts(str(x).split("; "))).sum(axis=0)
# Aplicar traducciones a los índices de relaciones
data_bar_f_rel.rename(index=traducciones, inplace=True)
data_bar_m_rel.rename(index=traducciones, inplace=True)
# Agregar barras de relación víctima-depredador (derecha)
fig.add_trace(go.Bar(name='Mujer', x=data_bar_f_rel.index, y=data_bar_f_rel), row=1, col=2)
fig.add_trace(go.Bar(name='Hombre', x=data_bar_m_rel.index, y=data_bar_m_rel), row=1, col=2)
# Ajustes de visualización y mostrar figura solo una vez
fig.update_traces(texttemplate='%{value}', textposition='outside')
fig.update_layout(title_text='Medios de Control (izquierda) y Relación Víctima-Depredador (derecha)')
fig.show()
Nuestro seguimiento al dataset de trata de personas en Reino Unido (UKHT) ¶
En el fragmento de código oculto a continuación, realizamos un análisis exploratorio de datos (EDA) sobre el dataset UKHT y observamos lo siguiente:
- Se han registrado algunos casos de extracción de órganos durante varios años en el Reino Unido.
- Las víctimas incluyen menores de edad.
- Las explotaciones de todo tipo han ido en aumento desde 2014.
- El aumento en la explotación laboral parece ser el más dramático, como muestra la figura a continuación.
# Dataset de trata de personas en Reino Unido (UK)
import pandas as pd
import plotly.express as px
# Cargar los archivos con rutas locales
uk_2013 = pd.read_csv(r"C:\Users\Gustavo\Desktop\Human T\2013_exploitation_type.csv")
uk_2014 = pd.read_csv(r"C:\Users\Gustavo\Desktop\Human T\2014_exploitation_type.csv")
uk_2015 = pd.read_csv(r"C:\Users\Gustavo\Desktop\Human T\2015_exploitation_type.csv")
uk_2016 = pd.read_csv(r"C:\Users\Gustavo\Desktop\Human T\2016_exploitation_type.csv")
# Normalizar nombres de columnas
uk_2016.rename(columns={'Claimed Exploitation Type': 'Claimed exploitation Type'}, inplace=True)
uk_2016.rename(columns={'Trans- gender': 'Transgender'}, inplace=True)
uk_2015.rename(columns={'Transsexual': 'Transgender'}, inplace=True)
# Agregar año
uk_2013['Year'] = 2013
uk_2014['Year'] = 2014
uk_2015['Year'] = 2015
uk_2016['Year'] = 2016
# Unificar solo columnas necesarias
cols = ['Claimed exploitation Type', 'Female', 'Male', 'Year']
uk_2013 = uk_2013[cols]
uk_2014 = uk_2014[cols]
uk_2015 = uk_2015[cols]
uk_2016 = uk_2016[cols]
# Unir los datasets
uk_df = pd.concat([uk_2013, uk_2014, uk_2015, uk_2016])
# Diccionario de traducción para los tipos de explotación
traduccion_explotacion = {
'Adult - Domestic Servitude': 'Adulto - Servidumbre doméstica',
'Adult - Labour Exploitation': 'Adulto - Explotación laboral',
'Adult - Sexual Exploitation': 'Adulto - Explotación sexual',
'Adult - Unknown exploitation': 'Adulto - Explotación desconocida',
'Minor - Domestic Servitude': 'Menor - Servidumbre doméstica',
'Minor - Labour Exploitation': 'Menor - Explotación laboral',
'Minor - Sexual Exploitation': 'Menor - Explotación sexual',
'Minor - Unknown exploitation': 'Menor - Explotación desconocida',
'Unknown age & Unknown exploitation type': 'Edad desconocida y tipo de explotación desconocido',
'Total': 'Total',
'Adult - Organ Harvesting': 'Adulto - Extracción de órganos',
'Minor - Organ Harvesting': 'Menor - Extracción de órganos',
'Unknown exploitation type (UK national)': 'Tipo de explotación desconocido (nacional UK)',
'Unknown exploitation type (non-UK National)': 'Tipo de explotación desconocido (no nacional UK)'
}
# Aplica la traducción a la columna
uk_df['Tipo de explotación reclamada'] = uk_df['Claimed exploitation Type'].replace(traduccion_explotacion)
# Ahora usa la columna traducida en el gráfico
fig = px.box(
uk_df,
y=['Female', 'Male'],
color='Year',
x='Tipo de explotación reclamada',
labels={
'value': 'Número de víctimas',
'variable': 'Género',
'Year': 'Año',
'Tipo de explotación reclamada': 'Tipo de explotación reclamada'
}
)
fig.update_layout(
title_text='Incidentes de trata reportados en Reino Unido (2013-2016)',
xaxis_title='Tipo de explotación reclamada',
yaxis_title='Número de víctimas',
legend_title='Año'
)
fig.show()